package com.cy.fetures;

import java.util.ArrayList;
import java.util.List;

/**
 * 泛型？
 * 1）泛型是编译时的一种类型，用于约束类中属性，方法参数，但是运行时无效。（面型类型擦除）
 * 2）泛型应用场景？（写框架、写工具类、写通用方法）
 * 3）泛型应用类型？（类泛型、方法泛型）
 * 3.1）类泛型，语法类名或接口名<泛型>（class ClassA<T>{},class ClassV<K,V,P,D>）
 * 类泛型约束中实例属性，非静态方法参数，非静态返回值类型
 * 3.2）方法泛型:语法-><泛型>方法返回值类型<泛型> 方法名（参数列表）
 * 方法泛型应用最多的场景时静态方法（static void print（T t）{}）
 * 4）泛型限定通配符
 * 4.1）？ 无界通配符
 * 4.2）？ super  下界限定通配符
 * 4.3）？ extends 上界限定通配符
 */
public class GenericeTests01 {

    /**
     * 类泛型
     */
    static class Container<E>{//new Container <String>()
        void add(E t){}
        E get() {return  null;}
    }
    /**
     * 泛型方法 T extends 通常应用于获取值
     */
    static <T  extends  Number> void print(T t){
    }
    /**
     * 泛型方法，？ super只能用于存数据 不限定上界  可以使用父类的Object 还有同样的String
     * 还有这三个接口Serializable, Comparable<String>, CharSequence
     */
    static <T> void  show(List<? super String> t){}

    /**
     * 上界限定通配符
     * @param t
     */
    static  void display(List<? extends  Number> t){
    }
     static void main(String[] args) {
     print(100);

     List<String> list = new ArrayList<>();
     List<Object> list2 = new ArrayList<>();
     show(list);
     show(list2);

     List<Integer> list1 = new ArrayList<>();
     List<Long> list3 = new ArrayList<>();
     display(list3);
     display(list1);
    }
}
